
/** auxui-v1.0.0  MIT License By http://auxui.aimlt.com */
define(['jquery'], function($){
    var rCRLF = /\r?\n/g;
    var feature = {};
    feature.fileapi = $('<input type="file">').get(0).files !== undefined;
    feature.formdata = (typeof window.FormData !== 'undefined');
    var hasProp = !! $.fn.prop;
    $.fn.attr2 = function() {
        if (!hasProp) {
            return this.attr.apply(this, arguments)
        }
        var val = this.prop.apply(this, arguments);
        if ((val && val.jquery) || typeof val === 'string') {
            return val
        }
        return this.attr.apply(this, arguments)
    };
    $.fn.ajaxSubmit = function(options, data, dataType, onSuccess) {
        if (!this.length) {
            log('ajaxSubmit: skipping submit process - no element selected');
            return this
        }
        var method, action, url, $form = this;
        if (typeof options === 'function') {
            options = {
                success: options
            }
        } else if (typeof options === 'string' || (options === false && arguments.length > 0)) {
            options = {
                'url': options,
                'data': data,
                'dataType': dataType
            };
            if (typeof onSuccess === 'function') {
                options.success = onSuccess
            }
        } else if (typeof options === 'undefined') {
            options = {}
        }
        method = options.method || options.type || this.attr2('method');
        action = options.url || this.attr2('action');
        url = (typeof action === 'string') ? $.trim(action) : '';
        url = url || window.location.href || '';
        if (url) {
            url = (url.match(/^([^#]+)/) || [])[1]
        }
        options = $.extend(true, {
            url: url,
            success: $.ajaxSettings.success,
            type: method || $.ajaxSettings.type,
            iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'
        }, options);
        var veto = {};
        this.trigger('form-pre-serialize', [this, options, veto]);
        if (veto.veto) {
            log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
            return this
        }
        if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
            log('ajaxSubmit: submit aborted via beforeSerialize callback');
            return this
        }
        var traditional = options.traditional;
        if (typeof traditional === 'undefined') {
            traditional = $.ajaxSettings.traditional
        }
        var elements = [];
        var qx, a = this.formToArray(options.semantic, elements, options.filtering);
        if (options.data) {
            var optionsData = $.isFunction(options.data) ? options.data(a) : options.data;
            options.extraData = optionsData;
            qx = $.param(optionsData, traditional)
        }
        if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
            log('ajaxSubmit: submit aborted via beforeSubmit callback');
            return this
        }
        this.trigger('form-submit-validate', [a, this, options, veto]);
        if (veto.veto) {
            log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
            return this
        }
        var q = $.param(a, traditional);
        if (qx) {
            q = (q ? (q + '&' + qx) : qx)
        }
        if (options.type.toUpperCase() === 'GET') {
            options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
            options.data = null
        } else {
            options.data = q
        }
        var callbacks = [];
        if (options.resetForm) {
            callbacks.push(function() {
                $form.resetForm()
            })
        }
        if (options.clearForm) {
            callbacks.push(function() {
                $form.clearForm(options.includeHidden)
            })
        }
        if (!options.dataType && options.target) {
            var oldSuccess = options.success ||
            function() {};
            callbacks.push(function(data, textStatus, jqXHR) {
                var successArguments = arguments,
                    fn = options.replaceTarget ? 'replaceWith' : 'html';
                $(options.target)[fn](data).each(function() {
                    oldSuccess.apply(this, successArguments)
                })
            })
        } else if (options.success) {
            if ($.isArray(options.success)) {
                $.merge(callbacks, options.success)
            } else {
                callbacks.push(options.success)
            }
        }
        options.success = function(data, status, xhr) {
            var context = options.context || this;
            for (var i = 0, max = callbacks.length; i < max; i++) {
                callbacks[i].apply(context, [data, status, xhr || $form, $form])
            }
        };
        if (options.error) {
            var oldError = options.error;
            options.error = function(xhr, status, error) {
                var context = options.context || this;
                oldError.apply(context, [xhr, status, error, $form])
            }
        }
        if (options.complete) {
            var oldComplete = options.complete;
            options.complete = function(xhr, status) {
                var context = options.context || this;
                oldComplete.apply(context, [xhr, status, $form])
            }
        }
        var fileInputs = $('input[type=file]:enabled', this).filter(function() {
            return $(this).val() !== ''
        });
        var hasFileInputs = fileInputs.length > 0;
        var mp = 'multipart/form-data';
        var multipart = ($form.attr('enctype') === mp || $form.attr('encoding') === mp);
        var fileAPI = feature.fileapi && feature.formdata;
        log('fileAPI :' + fileAPI);
        var shouldUseFrame = (hasFileInputs || multipart) && !fileAPI;
        var jqxhr;
        if (options.iframe !== false && (options.iframe || shouldUseFrame)) {
            if (options.closeKeepAlive) {
                $.get(options.closeKeepAlive, function() {
                    jqxhr = fileUploadIframe(a)
                })
            } else {
                jqxhr = fileUploadIframe(a)
            }
        } else if ((hasFileInputs || multipart) && fileAPI) {
            jqxhr = fileUploadXhr(a)
        } else {
            jqxhr = $.ajax(options)
        }
        $form.removeData('jqxhr').data('jqxhr', jqxhr);
        for (var k = 0; k < elements.length; k++) {
            elements[k] = null
        }
        this.trigger('form-submit-notify', [this, options]);
        return this;

        function deepSerialize(extraData) {
            var serialized = $.param(extraData, options.traditional).split('&');
            var len = serialized.length;
            var result = [];
            var i, part;
            for (i = 0; i < len; i++) {
                serialized[i] = serialized[i].replace(/\+/g, ' ');
                part = serialized[i].split('=');
                result.push([decodeURIComponent(part[0]), decodeURIComponent(part[1])])
            }
            return result
        }
        function fileUploadXhr(a) {
            var formdata = new FormData();
            for (var i = 0; i < a.length; i++) {
                formdata.append(a[i].name, a[i].value)
            }
            if (options.extraData) {
                var serializedData = deepSerialize(options.extraData);
                for (i = 0; i < serializedData.length; i++) {
                    if (serializedData[i]) {
                        formdata.append(serializedData[i][0], serializedData[i][1])
                    }
                }
            }
            options.data = null;
            var s = $.extend(true, {}, $.ajaxSettings, options, {
                contentType: false,
                processData: false,
                cache: false,
                type: method || 'POST'
            });
            if (options.uploadProgress) {
                s.xhr = function() {
                    var xhr = $.ajaxSettings.xhr();
                    if (xhr.upload) {
                        xhr.upload.addEventListener('progress', function(event) {
                            var percent = 0;
                            var position = event.loaded || event.position;
                            var total = event.total;
                            if (event.lengthComputable) {
                                percent = Math.ceil(position / total * 100)
                            }
                            options.uploadProgress(event, position, total, percent)
                        }, false)
                    }
                    return xhr
                }
            }
            s.data = null;
            var beforeSend = s.beforeSend;
            s.beforeSend = function(xhr, o) {
                if (options.formData) {
                    o.data = options.formData
                } else {
                    o.data = formdata
                }
                if (beforeSend) {
                    beforeSend.call(this, xhr, o)
                }
            };
            return $.ajax(s)
        }
        function fileUploadIframe(a) {
            var form = $form[0],
                el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle;
            var deferred = $.Deferred();
            deferred.abort = function(status) {
                xhr.abort(status)
            };
            if (a) {
                for (i = 0; i < elements.length; i++) {
                    el = $(elements[i]);
                    if (hasProp) {
                        el.prop('disabled', false)
                    } else {
                        el.removeAttr('disabled')
                    }
                }
            }
            s = $.extend(true, {}, $.ajaxSettings, options);
            s.context = s.context || s;
            id = 'jqFormIO' + new Date().getTime();
            var ownerDocument = form.ownerDocument;
            var $body = $form.closest('body');
            if (s.iframeTarget) {
                $io = $(s.iframeTarget, ownerDocument);
                n = $io.attr2('name');
                if (!n) {
                    $io.attr2('name', id)
                } else {
                    id = n
                }
            } else {
                $io = $('<iframe name="' + id + '" src="' + s.iframeSrc + '" />', ownerDocument);
                $io.css({
                    position: 'absolute',
                    top: '-1000px',
                    left: '-1000px'
                })
            }
            io = $io[0];
            xhr = {
                aborted: 0,
                responseText: null,
                responseXML: null,
                status: 0,
                statusText: 'n/a',
                getAllResponseHeaders: function() {},
                getResponseHeader: function() {},
                setRequestHeader: function() {},
                abort: function(status) {
                    var e = (status === 'timeout' ? 'timeout' : 'aborted');
                    log('aborting upload... ' + e);
                    this.aborted = 1;
                    try {
                        if (io.contentWindow.document.execCommand) {
                            io.contentWindow.document.execCommand('Stop')
                        }
                    } catch (ignore) {}
                    $io.attr('src', s.iframeSrc);
                    xhr.error = e;
                    if (s.error) {
                        s.error.call(s.context, xhr, e, status)
                    }
                    if (g) {
                        $.event.trigger('ajaxError', [xhr, s, e])
                    }
                    if (s.complete) {
                        s.complete.call(s.context, xhr, e)
                    }
                }
            };
            g = s.global;
            if (g && $.active++ === 0) {
                $.event.trigger('ajaxStart')
            }
            if (g) {
                $.event.trigger('ajaxSend', [xhr, s])
            }
            if (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false) {
                if (s.global) {
                    $.active--
                }
                deferred.reject();
                return deferred
            }
            if (xhr.aborted) {
                deferred.reject();
                return deferred
            }
            sub = form.clk;
            if (sub) {
                n = sub.name;
                if (n && !sub.disabled) {
                    s.extraData = s.extraData || {};
                    s.extraData[n] = sub.value;
                    if (sub.type === 'image') {
                        s.extraData[n + '.x'] = form.clk_x;
                        s.extraData[n + '.y'] = form.clk_y
                    }
                }
            }
            var CLIENT_TIMEOUT_ABORT = 1;
            var SERVER_ABORT = 2;

            function getDoc(frame) {
                var doc = null;
                try {
                    if (frame.contentWindow) {
                        doc = frame.contentWindow.document
                    }
                } catch (err) {
                    log('cannot get iframe.contentWindow document: ' + err)
                }
                if (doc) {
                    return doc
                }
                try {
                    doc = frame.contentDocument ? frame.contentDocument : frame.document
                } catch (err) {
                    log('cannot get iframe.contentDocument: ' + err);
                    doc = frame.document
                }
                return doc
            }
            var csrf_token = $('meta[name=csrf-token]').attr('content');
            var csrf_param = $('meta[name=csrf-param]').attr('content');
            if (csrf_param && csrf_token) {
                s.extraData = s.extraData || {};
                s.extraData[csrf_param] = csrf_token
            }
            function doSubmit() {
                var t = $form.attr2('target'),
                    a = $form.attr2('action'),
                    mp = 'multipart/form-data',
                    et = $form.attr('enctype') || $form.attr('encoding') || mp;
                form.setAttribute('target', id);
                if (!method || /post/i.test(method)) {
                    form.setAttribute('method', 'POST')
                }
                if (a !== s.url) {
                    form.setAttribute('action', s.url)
                }
                if (!s.skipEncodingOverride && (!method || /post/i.test(method))) {
                    $form.attr({
                        encoding: 'multipart/form-data',
                        enctype: 'multipart/form-data'
                    })
                }
                if (s.timeout) {
                    timeoutHandle = setTimeout(function() {
                        timedOut = true;
                        cb(CLIENT_TIMEOUT_ABORT)
                    }, s.timeout)
                }
                function checkState() {
                    try {
                        var state = getDoc(io).readyState;
                        log('state = ' + state);
                        if (state && state.toLowerCase() === 'uninitialized') {
                            setTimeout(checkState, 50)
                        }
                    } catch (e) {
                        log('Server abort: ', e, ' (', e.name, ')');
                        cb(SERVER_ABORT);
                        if (timeoutHandle) {
                            clearTimeout(timeoutHandle)
                        }
                        timeoutHandle = undefined
                    }
                }
                var extraInputs = [];
                try {
                    if (s.extraData) {
                        for (var n in s.extraData) {
                            if (s.extraData.hasOwnProperty(n)) {
                                if ($.isPlainObject(s.extraData[n]) && s.extraData[n].hasOwnProperty('name') && s.extraData[n].hasOwnProperty('value')) {
                                    extraInputs.push($('<input type="hidden" name="' + s.extraData[n].name + '">', ownerDocument).val(s.extraData[n].value).appendTo(form)[0])
                                } else {
                                    extraInputs.push($('<input type="hidden" name="' + n + '">', ownerDocument).val(s.extraData[n]).appendTo(form)[0])
                                }
                            }
                        }
                    }
                    if (!s.iframeTarget) {
                        $io.appendTo($body)
                    }
                    if (io.attachEvent) {
                        io.attachEvent('onload', cb)
                    } else {
                        io.addEventListener('load', cb, false)
                    }
                    setTimeout(checkState, 15);
                    try {
                        form.submit()
                    } catch (err) {
                        var submitFn = document.createElement('form').submit;
                        submitFn.apply(form)
                    }
                } finally {
                    form.setAttribute('action', a);
                    form.setAttribute('enctype', et);
                    if (t) {
                        form.setAttribute('target', t)
                    } else {
                        $form.removeAttr('target')
                    }
                    $(extraInputs).remove()
                }
            }
            if (s.forceSync) {
                doSubmit()
            } else {
                setTimeout(doSubmit, 10)
            }
            var data, doc, domCheckCount = 50,
                callbackProcessed;

            function cb(e) {
                if (xhr.aborted || callbackProcessed) {
                    return
                }
                doc = getDoc(io);
                if (!doc) {
                    log('cannot access response document');
                    e = SERVER_ABORT
                }
                if (e === CLIENT_TIMEOUT_ABORT && xhr) {
                    xhr.abort('timeout');
                    deferred.reject(xhr, 'timeout');
                    return
                } else if (e === SERVER_ABORT && xhr) {
                    xhr.abort('server abort');
                    deferred.reject(xhr, 'error', 'server abort');
                    return
                }
                if (!doc || doc.location.href === s.iframeSrc) {
                    if (!timedOut) {
                        return
                    }
                }
                if (io.detachEvent) {
                    io.detachEvent('onload', cb)
                } else {
                    io.removeEventListener('load', cb, false)
                }
                var status = 'success',
                    errMsg;
                try {
                    if (timedOut) {
                        throw 'timeout';
                    }
                    var isXml = s.dataType === 'xml' || doc.XMLDocument || $.isXMLDoc(doc);
                    log('isXml=' + isXml);
                    if (!isXml && window.opera && (doc.body === null || !doc.body.innerHTML)) {
                        if (--domCheckCount) {
                            log('requeing onLoad callback, DOM not available');
                            setTimeout(cb, 250);
                            return
                        }
                    }
                    var docRoot = doc.body ? doc.body : doc.documentElement;
                    xhr.responseText = docRoot ? docRoot.innerHTML : null;
                    xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
                    if (isXml) {
                        s.dataType = 'xml'
                    }
                    xhr.getResponseHeader = function(header) {
                        var headers = {
                            'content-type': s.dataType
                        };
                        return headers[header.toLowerCase()]
                    };
                    if (docRoot) {
                        xhr.status = Number(docRoot.getAttribute('status')) || xhr.status;
                        xhr.statusText = docRoot.getAttribute('statusText') || xhr.statusText
                    }
                    var dt = (s.dataType || '').toLowerCase();
                    var scr = /(json|script|text)/.test(dt);
                    if (scr || s.textarea) {
                        var ta = doc.getElementsByTagName('textarea')[0];
                        if (ta) {
                            xhr.responseText = ta.value;
                            xhr.status = Number(ta.getAttribute('status')) || xhr.status;
                            xhr.statusText = ta.getAttribute('statusText') || xhr.statusText
                        } else if (scr) {
                            var pre = doc.getElementsByTagName('pre')[0];
                            var b = doc.getElementsByTagName('body')[0];
                            if (pre) {
                                xhr.responseText = pre.textContent ? pre.textContent : pre.innerText
                            } else if (b) {
                                xhr.responseText = b.textContent ? b.textContent : b.innerText
                            }
                        }
                    } else if (dt === 'xml' && !xhr.responseXML && xhr.responseText) {
                        xhr.responseXML = toXml(xhr.responseText)
                    }
                    try {
                        data = httpData(xhr, dt, s)
                    } catch (err) {
                        status = 'parsererror';
                        xhr.error = errMsg = (err || status)
                    }
                } catch (err) {
                    log('error caught: ', err);
                    status = 'error';
                    xhr.error = errMsg = (err || status)
                }
                if (xhr.aborted) {
                    log('upload aborted');
                    status = null
                }
                if (xhr.status) {
                    status = ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) ? 'success' : 'error'
                }
                if (status === 'success') {
                    if (s.success) {
                        s.success.call(s.context, data, 'success', xhr)
                    }
                    deferred.resolve(xhr.responseText, 'success', xhr);
                    if (g) {
                        $.event.trigger('ajaxSuccess', [xhr, s])
                    }
                } else if (status) {
                    if (typeof errMsg === 'undefined') {
                        errMsg = xhr.statusText
                    }
                    if (s.error) {
                        s.error.call(s.context, xhr, status, errMsg)
                    }
                    deferred.reject(xhr, 'error', errMsg);
                    if (g) {
                        $.event.trigger('ajaxError', [xhr, s, errMsg])
                    }
                }
                if (g) {
                    $.event.trigger('ajaxComplete', [xhr, s])
                }
                if (g && !--$.active) {
                    $.event.trigger('ajaxStop')
                }
                if (s.complete) {
                    s.complete.call(s.context, xhr, status)
                }
                callbackProcessed = true;
                if (s.timeout) {
                    clearTimeout(timeoutHandle)
                }
                setTimeout(function() {
                    if (!s.iframeTarget) {
                        $io.remove()
                    } else {
                        $io.attr('src', s.iframeSrc)
                    }
                    xhr.responseXML = null
                }, 100)
            }
            var toXml = $.parseXML ||
            function(s, doc) {
                if (window.ActiveXObject) {
                    doc = new ActiveXObject('Microsoft.XMLDOM');
                    doc.async = 'false';
                    doc.loadXML(s)
                } else {
                    doc = (new DOMParser()).parseFromString(s, 'text/xml')
                }
                return (doc && doc.documentElement && doc.documentElement.nodeName !== 'parsererror') ? doc : null
            };
            var parseJSON = $.parseJSON ||
            function(s) {
                return window['eval']('(' + s + ')')
            };
            var httpData = function(xhr, type, s) {
                    var ct = xhr.getResponseHeader('content-type') || '',
                        xml = ((type === 'xml' || !type) && ct.indexOf('xml') >= 0),
                        data = xml ? xhr.responseXML : xhr.responseText;
                    if (xml && data.documentElement.nodeName === 'parsererror') {
                        if ($.error) {
                            $.error('parsererror')
                        }
                    }
                    if (s && s.dataFilter) {
                        data = s.dataFilter(data, type)
                    }
                    if (typeof data === 'string') {
                        if ((type === 'json' || !type) && ct.indexOf('json') >= 0) {
                            data = parseJSON(data)
                        } else if ((type === 'script' || !type) && ct.indexOf('javascript') >= 0) {
                            $.globalEval(data)
                        }
                    }
                    return data
                };
            return deferred
        }
    };
    $.fn.ajaxForm = function(options, data, dataType, onSuccess) {
        if (typeof options === 'string' || (options === false && arguments.length > 0)) {
            options = {
                'url': options,
                'data': data,
                'dataType': dataType
            };
            if (typeof onSuccess === 'function') {
                options.success = onSuccess
            }
        }
        options = options || {};
        options.delegation = options.delegation && $.isFunction($.fn.on);
        if (!options.delegation && this.length === 0) {
            var o = {
                s: this.selector,
                c: this.context
            };
            if (!$.isReady && o.s) {
                log('DOM not ready, queuing ajaxForm');
                $(function() {
                    $(o.s, o.c).ajaxForm(options)
                });
                return this
            }
            log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
            return this
        }
        if (options.delegation) {
            $(document).off('submit.form-plugin', this.selector, doAjaxSubmit).off('click.form-plugin', this.selector, captureSubmittingElement).on('submit.form-plugin', this.selector, options, doAjaxSubmit).on('click.form-plugin', this.selector, options, captureSubmittingElement);
            return this
        }
        return this.ajaxFormUnbind().on('submit.form-plugin', options, doAjaxSubmit).on('click.form-plugin', options, captureSubmittingElement)
    };

    function doAjaxSubmit(e) {
        var options = e.data;
        if (!e.isDefaultPrevented()) {
            e.preventDefault();
            $(e.target).closest('form').ajaxSubmit(options)
        }
    }
    function captureSubmittingElement(e) {
        var target = e.target;
        var $el = $(target);
        if (!$el.is('[type=submit],[type=image]')) {
            var t = $el.closest('[type=submit]');
            if (t.length === 0) {
                return
            }
            target = t[0]
        }
        var form = target.form;
        form.clk = target;
        if (target.type === 'image') {
            if (typeof e.offsetX !== 'undefined') {
                form.clk_x = e.offsetX;
                form.clk_y = e.offsetY
            } else if (typeof $.fn.offset === 'function') {
                var offset = $el.offset();
                form.clk_x = e.pageX - offset.left;
                form.clk_y = e.pageY - offset.top
            } else {
                form.clk_x = e.pageX - target.offsetLeft;
                form.clk_y = e.pageY - target.offsetTop
            }
        }
        setTimeout(function() {
            form.clk = form.clk_x = form.clk_y = null
        }, 100)
    }
    $.fn.ajaxFormUnbind = function() {
        return this.off('submit.form-plugin click.form-plugin')
    };
    $.fn.formToArray = function(semantic, elements, filtering) {
        var a = [];
        if (this.length === 0) {
            return a
        }
        var form = this[0];
        var formId = this.attr('id');
        var els = (semantic || typeof form.elements === 'undefined') ? form.getElementsByTagName('*') : form.elements;
        var els2;
        if (els) {
            els = $.makeArray(els)
        }
        if (formId && (semantic || /(Edge|Trident)\//.test(navigator.userAgent))) {
            els2 = $(':input[form="' + formId + '"]').get();
            if (els2.length) {
                els = (els || []).concat(els2)
            }
        }
        if (!els || !els.length) {
            return a
        }
        if ($.isFunction(filtering)) {
            els = $.map(els, filtering)
        }
        var i, j, n, v, el, max, jmax;
        for (i = 0, max = els.length; i < max; i++) {
            el = els[i];
            n = el.name;
            if (!n || el.disabled) {
                continue
            }
            if (semantic && form.clk && el.type === 'image') {
                if (form.clk === el) {
                    a.push({
                        name: n,
                        value: $(el).val(),
                        type: el.type
                    });
                    a.push({
                        name: n + '.x',
                        value: form.clk_x
                    }, {
                        name: n + '.y',
                        value: form.clk_y
                    })
                }
                continue
            }
            v = $.fieldValue(el, true);
            if (v && v.constructor === Array) {
                if (elements) {
                    elements.push(el)
                }
                for (j = 0, jmax = v.length; j < jmax; j++) {
                    a.push({
                        name: n,
                        value: v[j]
                    })
                }
            } else if (feature.fileapi && el.type === 'file') {
                if (elements) {
                    elements.push(el)
                }
                var files = el.files;
                if (files.length) {
                    for (j = 0; j < files.length; j++) {
                        a.push({
                            name: n,
                            value: files[j],
                            type: el.type
                        })
                    }
                } else {
                    a.push({
                        name: n,
                        value: '',
                        type: el.type
                    })
                }
            } else if (v !== null && typeof v !== 'undefined') {
                if (elements) {
                    elements.push(el)
                }
                a.push({
                    name: n,
                    value: v,
                    type: el.type,
                    required: el.required
                })
            }
        }
        if (!semantic && form.clk) {
            var $input = $(form.clk),
                input = $input[0];
            n = input.name;
            if (n && !input.disabled && input.type === 'image') {
                a.push({
                    name: n,
                    value: $input.val()
                });
                a.push({
                    name: n + '.x',
                    value: form.clk_x
                }, {
                    name: n + '.y',
                    value: form.clk_y
                })
            }
        }
        return a
    };
    $.fn.formSerialize = function(semantic) {
        return $.param(this.formToArray(semantic))
    };
    $.fn.fieldSerialize = function(successful) {
        var a = [];
        this.each(function() {
            var n = this.name;
            if (!n) {
                return
            }
            var v = $.fieldValue(this, successful);
            if (v && v.constructor === Array) {
                for (var i = 0, max = v.length; i < max; i++) {
                    a.push({
                        name: n,
                        value: v[i]
                    })
                }
            } else if (v !== null && typeof v !== 'undefined') {
                a.push({
                    name: this.name,
                    value: v
                })
            }
        });
        return $.param(a)
    };
    $.fn.fieldValue = function(successful) {
        for (var val = [], i = 0, max = this.length; i < max; i++) {
            var el = this[i];
            var v = $.fieldValue(el, successful);
            if (v === null || typeof v === 'undefined' || (v.constructor === Array && !v.length)) {
                continue
            }
            if (v.constructor === Array) {
                $.merge(val, v)
            } else {
                val.push(v)
            }
        }
        return val
    };
    $.fieldValue = function(el, successful) {
        var n = el.name,
            t = el.type,
            tag = el.tagName.toLowerCase();
        if (typeof successful === 'undefined') {
            successful = true
        }
        if (successful && (!n || el.disabled || t === 'reset' || t === 'button' || (t === 'checkbox' || t === 'radio') && !el.checked || (t === 'submit' || t === 'image') && el.form && el.form.clk !== el || tag === 'select' && el.selectedIndex === -1)) {
            return null
        }
        if (tag === 'select') {
            var index = el.selectedIndex;
            if (index < 0) {
                return null
            }
            var a = [],
                ops = el.options;
            var one = (t === 'select-one');
            var max = (one ? index + 1 : ops.length);
            for (var i = (one ? index : 0); i < max; i++) {
                var op = ops[i];
                if (op.selected && !op.disabled) {
                    var v = op.value;
                    if (!v) {
                        v = (op.attributes && op.attributes.value && !(op.attributes.value.specified)) ? op.text : op.value
                    }
                    if (one) {
                        return v
                    }
                    a.push(v)
                }
            }
            return a
        }
        return $(el).val().replace(rCRLF, '\r\n')
    };
    $.fn.clearForm = function(includeHidden) {
        return this.each(function() {
            $('input,select,textarea', this).clearFields(includeHidden)
        })
    };
    $.fn.clearFields = $.fn.clearInputs = function(includeHidden) {
        var re = /^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i;
        return this.each(function() {
            var t = this.type,
                tag = this.tagName.toLowerCase();
            if (re.test(t) || tag === 'textarea') {
                this.value = ''
            } else if (t === 'checkbox' || t === 'radio') {
                this.checked = false
            } else if (tag === 'select') {
                this.selectedIndex = -1
            } else if (t === 'file') {
                if (/MSIE/.test(navigator.userAgent)) {
                    $(this).replaceWith($(this).clone(true))
                } else {
                    $(this).val('')
                }
            } else if (includeHidden) {
                if ((includeHidden === true && /hidden/.test(t)) || (typeof includeHidden === 'string' && $(this).is(includeHidden))) {
                    this.value = ''
                }
            }
        })
    };
    $.fn.resetForm = function() {
        return this.each(function() {
            var el = $(this);
            var tag = this.tagName.toLowerCase();
            switch (tag) {
            case 'input':
                this.checked = this.defaultChecked;
            case 'textarea':
                this.value = this.defaultValue;
                return true;
            case 'option':
            case 'optgroup':
                var select = el.parents('select');
                if (select.length && select[0].multiple) {
                    if (tag === 'option') {
                        this.selected = this.defaultSelected
                    } else {
                        el.find('option').resetForm()
                    }
                } else {
                    select.resetForm()
                }
                return true;
            case 'select':
                el.find('option').each(function(i) {
                    this.selected = this.defaultSelected;
                    if (this.defaultSelected && !el[0].multiple) {
                        el[0].selectedIndex = i;
                        return false
                    }
                });
                return true;
            case 'label':
                var forEl = $(el.attr('for'));
                var list = el.find('input,select,textarea');
                if (forEl[0]) {
                    list.unshift(forEl[0])
                }
                list.resetForm();
                return true;
            case 'form':
                if (typeof this.reset === 'function' || (typeof this.reset === 'object' && !this.reset.nodeType)) {
                    this.reset()
                }
                return true;
            default:
                el.find('form,input,label,select,textarea').resetForm();
                return true
            }
        })
    };
    $.fn.enable = function(b) {
        if (typeof b === 'undefined') {
            b = true
        }
        return this.each(function() {
            this.disabled = !b
        })
    };
    $.fn.selected = function(select) {
        if (typeof select === 'undefined') {
            select = true
        }
        return this.each(function() {
            var t = this.type;
            if (t === 'checkbox' || t === 'radio') {
                this.checked = select
            } else if (this.tagName.toLowerCase() === 'option') {
                var $sel = $(this).parent('select');
                if (select && $sel[0] && $sel[0].type === 'select-one') {
                    $sel.find('option').selected(false)
                }
                this.selected = select
            }
        })
    };
    $.fn.ajaxSubmit.debug = false;

    function log() {
        if (!$.fn.ajaxSubmit.debug) {
            return
        }
        var msg = '[jquery.form] ' + Array.prototype.join.call(arguments, '');
        if (window.console && window.console.log) {
            window.console.log(msg)
        } else if (window.opera && window.opera.postError) {
            window.opera.postError(msg)
        }
    }

    /* ========================================================================
     * 开关控件 switchs
     * ======================================================================== */
    +function($) {
        'use strict';
        var Switchs = function(ele, opt, val) {
            this.$ele = ele;
            this.defaults = {
                onText : 'ON',
                offText : 'OFF',
                skin : 'info',
                action : false,
                disabled : false
            },
            this.options = $.extend({}, this.defaults, opt);
        }

        Switchs.VERSION = '1.0';

        Switchs.prototype.init = function() {
            var $ele = this.$ele;
            var $options = this.options;

            if (typeof($ele.attr('data-onText')) === 'string') {
                $options.onText = $ele.attr('data-onText');
            }
            if (typeof($ele.attr('data-offText')) === 'string') {
                $options.offText = $ele.attr('data-offText');
            }
            if (typeof($ele.attr('data-skin')) === 'string') {
                $options.skin = $ele.attr('data-skin');
            }
            if (typeof($ele.attr('data-action')) === 'string') {
                $options.action = $ele.attr('data-action') == 'true' ? true : false;
            }
            if (typeof($ele.attr('data-disabled')) === 'string') {
                $options.disabled = $ele.attr('data-disabled') == 'true' ? true : false;
            }
            if (typeof($ele.attr('data-size')) === 'string') {
                $options.size = $ele.attr('data-size');
            }

            if($ele.parents('.btn-group').parents('.ui-switch').size() < 1) {
                $ele.wrap('<div class="ui-switch"><div class="btn-group" role="group"></div></div>');
                $ele.before('<a href="javascript:;" class="btn btn-'+$options.skin+' switch-handle-on">'+$options.onText+'</a> <a href="javascript:;" class="btn btn-default switch-label"></a> <a href="javascript:;" class="btn btn-default switch-handle-off">'+$options.offText+'</a>');
            }

            $ele.attr('data-toggle','switch');
            $ele.addClass('switch-change');
            if (typeof $options.size === 'string') {
                $ele.parents('.btn-group').addClass('btn-group-' + $options.size);
                $ele.parents('.btn-group').parents('.ui-switch').attr('data-size', $options.size);
            }

            $ele.parents('.btn-group').parents('.ui-switch').attr('data-action', 'false');
            $ele.parents('.btn-group').find('input[type="radio"]').hide();

            var onBtnWidth = $ele.parents('.btn-group').find('.switch-handle-on').outerWidth(true),
                offBtnWidth = $ele.parents('.btn-group').find('.switch-handle-off').outerWidth(true),
                offBtnHeight = $ele.parents('.btn-group').find('.switch-handle-off').outerHeight(true);

            $ele.parents('.btn-group').css('width', onBtnWidth + offBtnWidth * 2 + 10);
            $ele.parents('.btn-group').parents('.ui-switch').find('.switch-label').css({
                'width' : offBtnWidth, 
                'height' : offBtnHeight
            });

            $ele.parents('.btn-group').parents('.ui-switch').css({
                'width' : onBtnWidth + offBtnWidth - 1,
                'height' : offBtnHeight
            });

            $('.ui-switch > .btn-group > .btn').off("click").click(Switchs.switchClick);
            
            Switchs.action($ele, $options.action);

            Switchs.disabled($ele, $options.disabled);

        }

        Switchs.switchChange = function(e) {
            var ele = $(e.target);
            var action = ele.parents('.btn-group').parents('.ui-switch').find('input[type="radio"]').get(0).checked;
            ele.trigger('switch-change', [{
                action : action,
                value : action == true ? ele.parents('.btn-group').find('input[type="radio"]').val() : false,
                ele : ele.parents('.btn-group').find('input[type="radio"]')
            }]);
        }

        Switchs.switchClick = function(e) {
            var ele = $(e.target),
                action = ele.parents('.btn-group').parents('.ui-switch').find('input[type="radio"]').is(":checked") ? false : true,
                onBtnWidth = ele.parents('.btn-group').find('.switch-handle-on').outerWidth(true),
                offBtnWidth = ele.parents('.btn-group').find('.switch-handle-off').outerWidth(true);

            ele.parents('.btn-group').parents('.ui-switch').find('input[type="radio"]').get(0).checked = action;
            if(action){
                ele.parents('.btn-group').find('.switch-label').css({
                    'width' : offBtnWidth
                });
                ele.parents('.btn-group').find('.switch-handle-on').animate({
                    'margin-left' : '0'
                });
                ele.parents('.btn-group').parents('.ui-switch').attr('data-action', 'true');
            }else{
                ele.parents('.btn-group').find('.switch-handle-on').animate({
                    'margin-left' : '-' + offBtnWidth
                });
                ele.parents('.btn-group').parents('.ui-switch').attr('data-action', 'false');
            }
            ele.parents('.btn-group').find('.btn').blur();
            Switchs.switchChange(e);
        }

        Switchs.action = function(ele, val) {
            var onBtnWidth = ele.parents('.btn-group').find('.switch-handle-on').outerWidth(true),
                offBtnWidth = ele.parents('.btn-group').find('.switch-handle-off').outerWidth(true),
                offBtnHeight = ele.parents('.btn-group').find('.switch-handle-off').outerHeight(true),
                s = ele.parents('.btn-group').find('input[type="radio"]').size();
            ele.parents('.btn-group').parents('.ui-switch').attr('data-action', "'"+val+"'");
            if(val == true) {
                if(s > 0) ele.parents('.btn-group').find('input[type="radio"]').get(0).checked = true;
                ele.parents('.btn-group').find('.switch-handle-on').animate({
                    'margin-left' : 0
                });
                
            }else{
                if(s > 0)  ele.parents('.btn-group').find('input[type="radio"]').get(0).checked = false;
                ele.parents('.btn-group').find('.switch-handle-on').animate({
                    'margin-left' : '-' + offBtnWidth
                });
            }
        }

        Switchs.disabled = function(ele, val) {
            ele.attr('disabled', val);
            if(val == true){
                ele.parents('.btn-group').find('.btn').addClass('disabled');
            }else{
                ele.parents('.btn-group').find('.btn').removeClass('disabled');
            }
        }

        Switchs.setSwitch = function(ele, opt, val) {
            var onBtnWidth = ele.parents('.btn-group').find('.switch-handle-on').outerWidth(true),
                offBtnWidth = ele.parents('.btn-group').find('.switch-handle-off').outerWidth(true),
                offBtnHeight = ele.parents('.btn-group').find('.switch-handle-off').outerHeight(true);

            if(opt == 'onText') {
                ele.parents('.btn-group').find('.switch-handle-on').html(val);
            }else if(opt == 'offText'){
                ele.parents('.btn-group').find('.switch-handle-off').html(val);
            }else if(opt == 'size'){
                ele.parents('.btn-group').attr('class', 'btn-group btn-group-' + val).parents('.ui-switch').attr('data-size', val);
            }else if(opt == 'skin'){
                ele.parents('.btn-group').find('.switch-handle-on').attr('class', 'btn switch-handle-on btn-' + val);
            }else if(opt == 'action'){
                Switchs.action(ele, val);
            }else if(opt == 'disabled'){
                Switchs.disabled(ele, val);
            }
            ele.parents('.btn-group').css('width', onBtnWidth + offBtnWidth * 2 + 10);
            ele.parents('.btn-group').parents('.ui-switch').find('.switch-label').css({
                'width' : offBtnWidth, 
                'height' : offBtnHeight
            });

            ele.parents('.btn-group').parents('.ui-switch').css({
                'width' : onBtnWidth + offBtnWidth - 1,
                'height' : offBtnHeight
            });
        }

        $.fn.switch = function(options, val) {
            var _switch = new Switchs(this, options, val);
            if(typeof(options) == 'string' && typeof(options) != 'undefined') {
                Switchs.setSwitch(this, options, val);
            }else{
                return _switch.init();
            }
        }

    }(jQuery);


    /* ========================================================================
     * 增强复选框和单选按钮 icheck
     * ======================================================================== */
    +function($) {
        'use strict';

        var icheck = 'ui-icheck';
        var icheck_inline = 'ui-icheck-inline';
        var icheck_click = 'ui-icheck-click';
        var icheck_icon = {
            radio : {
                checked : '&#xe6c5;',
                checked_no : '&#xe67b;'
            },
            checkbox : {
                checked : '&#xe8f8;',
                checked_no : ''
            }
        }

        var Icheck = function(element, options) {
            this.$element = $(element);
            this.options = $.extend({}, Icheck.DEFAULTS, options);
            this.options.icheck = '.' + icheck;
            this.options.icheck_inline = '.' + icheck_inline;
            this.options.icheck_icon = icheck_icon;
            Structure(this.$element, this.options);
        }

        function Structure(ele, options){
            var fn, type;
            ele.each(function(index, el) {
                type = $(el).attr('type');
                if(typeof(type) == 'undefined') return false;
                fn = 'Structure_' + type + '(ele, options)';
                if(typeof(eval(fn)) == "function") eval(fn);
            });
        }

        function Structure_checkbox(ele, options){
            if(ele.parent(options.icheck).size() < 1){
                ele.wrap('<a href="javascript:;" class="btn"></a>');
            }
            var el;
            var elClass = ele.attr('data-display') == 'inline' ? icheck_inline : icheck;
            ele.parent('.btn').addClass(elClass).attr({
                'data-id' : randoms(),
                'data-type' : ele.attr('type'),
                'data-value' : ele.val()
            }).addClass(icheck_click);
            ele.before('<i class="auxui-icon"></i><span></span>');
            ele.attr('data-ident', ele.parent('.btn').attr('data-id'));
            el = ele.parent('.' + elClass);
            el.find('span').html(ele.attr('title'));
            if(ele.get(0).checked == true){
                el.find('.auxui-icon').html(options.icheck_icon.checkbox.checked);
                el.attr('data-checked', 'true');
            }
            if(ele.get(0).disabled == true){
                el.addClass('disabled');
            }
        }

        function Structure_radio(ele, options){
            if(ele.parent(options.icheck).size() < 1){
                ele.wrap('<a href="javascript:;" class="btn"></a>');
            }
            var el;
            var elClass = ele.attr('data-display') == 'inline' ? icheck_inline : icheck;
            ele.before('<i class="auxui-icon"></i><span></span>');
            ele.parent('.btn').addClass(elClass).attr({
                'data-id' : randoms(),
                'data-type' : ele.attr('type'),
                'data-value' : ele.val()
            }).addClass(icheck_click);
            ele.attr('data-ident', ele.parent('.btn').attr('data-id'));
            el = ele.parent('.' + elClass);
            el.find('.auxui-icon').html(ele.get(0).checked == true ? options.icheck_icon.radio.checked : options.icheck_icon.radio.checked_no);
            el.find('span').html(ele.attr('title'));
            if(ele.get(0).checked == true){
                el.attr('data-checked', 'true');
            }
            if(ele.get(0).disabled == true){
                el.addClass('disabled');
            }
        }

        function setchecked(ele){
            var type = ele.parent('.'+icheck_click).attr('data-type');
            var id = ele.attr('data-id');
            if(type == 'radio'){
                ele.parent('.' + icheck_click).parent().find('.' + icheck_click+'[data-type="radio"]').each(function(index, el) {
                    $(this).find('input[type="radio"]').get(0).checked = false;
                    $(this).attr('data-checked', 'false').find('.auxui-icon').html(icheck_icon.radio.checked_no);
                });
                ele.get(0).checked = true;
                ele.parent('.' + icheck_click).attr('data-checked', 'true').find('.auxui-icon').html(icheck_icon.radio.checked);
            }else{
                ele.get(0).checked = ele.get(0).checked == true ? false : true;
                ele.parent('.'+icheck_click).attr('data-checked', ele.get(0).checked == true ? 'true' : 'false').find('.auxui-icon').html(ele.get(0).checked == true ? icheck_icon.checkbox.checked : icheck_icon.checkbox.checked_no);
            }
        }

        function randoms(max, min){
            max = typeof(max) == "undefined" ? 999999999 : max;
            min = typeof(min) == "undefined" ? 100000001 : min;
            return parseInt(Math.random()*(max-min+1)+min,10);
        }

        function Plugin(option) {
            return this.each(function() {
                var $this = $(this);
                var options = typeof option == 'object' && option;
                new Icheck($this, options);
            });
        }

        Icheck.VERSION = '1.0';

        var old = $.fn.icheck;

        $.fn.icheck = Plugin;
        $.fn.icheck.Constructor = Icheck;

        $.fn.icheck.noConflict = function() {
            $.fn.icheck = old;
            return this;
        }

        $(document).on('click', '.' + icheck_click, function (e) {
            var id = $(this).attr('data-id');
            var ele = $(this).find('input[data-ident="'+id+'"]');
            setchecked(ele);
            $(this).trigger('icheck', [{
                id : id,
                elem : ele,
                othis : $(this),
                checked : ele.get(0).checked,
                text :  ele.attr('title'),
                value : $(this).attr('data-value')
            }]);
        });

    }(jQuery);

    /* ========================================================================
     * 增强选择框 select
     * ======================================================================== */
    +function($) {
        'use strict';

        var select = 'ui-select';
        var jsclick = 'ui-select-jsclick-tiem';

        var Iselect = function(element, options) {
            this.$element = $(element);
            this.options = $.extend({}, Iselect.DEFAULTS, options);
            Structure(this.$element, this.options);
        }

        function Structure(ele, options){
            var fn = '';
            var toggle = ele.attr('data-toggle');
            toggle = typeof(toggle) == 'undefined' ? 'single' : toggle;
            ele.each(function(index, el) {
                fn = 'Structure_' + toggle + '(ele, options)';
                if(typeof(eval(fn)) == "function") eval(fn);
            });
        }

        function Structure_multlist(ele, options){
            var id = randoms(1001,999999);
            var v = '';
            var ident = 0;
            var html = '<div class="list-group"></div>';
            ele.after(html).attr('data-id', id).hide().next('.list-group').addClass(select).attr('data-id', id);
            var _select = ele.next('.' + select + '[data-id="'+id+'"]');
            ele.find('option').each(function(index, el) {
                ident = randoms(100001,999999);
                $(this).attr('data-ident', ident);
                _select.append('<a href="javascript:;" class="list-group-item '+jsclick+'" data-ident="'+ident+'" data-value="'+$(el).val()+'">'+$(el).text()+'</a>');
                if($(this).get(0).selected){
                    _select.find('.list-group-item').eq(index).addClass('active').attr('data-selected', 'true');
                }
                if($(this).get(0).disabled){
                    _select.find('.list-group-item').eq(index).addClass('disabled').attr('data-disabled', 'true');
                }
            });
        }

        function Structure_multlist_search(ele, options){
            var id = randoms(1001,999999);
            var v = '';
            var ident = 0;
            var h = ele.attr('data-search') == 'true' ? '<div href="javascript:;" class="list-group-item list-soall"><div class="input-group"> <span class="input-group-addon"><input type="checkbox" data-type="all"></span> <input type="text" class="form-control" placeholder="直接选择或搜索选择"> </div></div>' : '';
            var html = '<div class="list-group list-multlist-group">'+h+'<div class="list-multlist-item"></div></div>';
            ele.after(html).attr('data-id', id).hide().next('.list-group').addClass(select).attr('data-id', id);
            var _select = ele.next('.' + select + '[data-id="'+id+'"]');
            ele.find('option').each(function(index, el) {
                ident = randoms(100001,999999);
                $(this).attr('data-ident', ident);
                _select.find('.list-multlist-item').append('<div href="javascript:;" class="list-group-item" data-value="'+$(el).val()+'" data-ident="'+ident+'"><input type="checkbox" data-value="'+$(el).val()+'" title="'+$(el).text()+'"></div>');
                if($(this).get(0).selected){
                    _select.find('.list-group-item').find('[type="checkbox"][data-value="'+$(el).val()+'"]').get(0).checked = true;
                }
                if($(this).get(0).disabled){
                    _select.find('.list-group-item').eq(index).find('[type="checkbox"]').get(0).disabled = true;
                }
            });
            
            _select.on('icheck', function (e,data) {
                var ident = data.elem.parent('.ui-icheck').parent('.list-group-item').attr('data-ident');
                if (typeof(ident) != "undefined" && ident != '') { 
                    ele.find('option[data-ident="'+ident+'"]').get(0).selected = data.checked;
                }
                if( data.elem.attr('data-type') == 'all'){
                    ele.find('option').each(function(index, el) {
                        ident = $(el).attr('data-ident');
                        $(el).get(0).selected = data.checked;
                        if(data.checked){
                            _select.find('.list-group-item[data-ident="'+ident+'"]').find('.ui-icheck').attr('data-checked', 'true');
                            _select.find('.list-group-item[data-ident="'+ident+'"]').find('.ui-icheck .auxui-icon').html('&#xe8f8;');
                        }else{
                            _select.find('.list-group-item[data-ident="'+ident+'"]').find('.ui-icheck').attr('data-checked', 'false');
                            _select.find('.list-group-item[data-ident="'+ident+'"]').find('.ui-icheck .auxui-icon').html('');
                        }
                    });
                }
            });

            _select.find('.form-control').removeAttr('readonly').on('input propertychange',function(){
                v = $.trim($(this).val());
                _select.find('.list-group-item[data-ident]').hide();
                _select.find('.list-group-item .ui-icheck span:contains("'+v+'")').parent('.ui-icheck').parent('.list-group-item').show();
            });

         

            _select.find('[type="checkbox"]').icheck();
        }

        

        function Structure_singlelist(ele, options){
            var id = randoms(1001,999999);
            var v = '';
            var ident = 0;
            var html = '<div class="list-group"></div>';
            ele.after(html).attr('data-id', id).hide().next('.list-group').addClass(select).attr('data-id', id);
            var _select = ele.next('.' + select + '[data-id="'+id+'"]');
            ele.find('option').each(function(index, el) {
                ident = randoms(100001,999999);
                $(this).attr('data-ident', ident);
                _select.append('<a href="javascript:;" class="list-group-item '+jsclick+'" data-ident="'+ident+'" data-value="'+$(el).val()+'">'+$(el).text()+'</a>');
                if($(this).get(0).selected){
                    _select.find('.list-group-item').eq(index).addClass('active');
                }
                if($(this).get(0).disabled){
                    _select.find('.list-group-item').eq(index).addClass('disabled').attr('data-disabled', 'true');
                }
            });
            setEleInline(ele, options);
        }

        function Structure_search(ele, options){
            var id = randoms(1001,999999);
            var ident = 0;
            var v = '';
            var html = '<div class="dropdown input-group"><input type="text" class="form-control dropdown-toggle" placeholder="直接选择或搜索选择" id="select-'+id+'" data-toggle="dropdown"> <span class="input-group-addon"><span class="caret"></span></span><ul class="dropdown-menu" aria-labelledby="select-'+id+'"></ul></div>';
            ele.after(html).attr('data-id', id).hide().next('.dropdown').addClass(select).attr('data-id', id);
            var _select = ele.next('.' + select + '[data-id="'+id+'"]');
            var elsize = ele.attr('data-size');
            if(typeof(elsize) != "undefined" && elsize != ''){
                _select.find('.dropdown-toggle').addClass('input-'+elsize);
            }
            ele.find('option').each(function(index, el) {
                ident = randoms(100001,999999);
                $(this).attr('data-ident', ident);
                _select.find('.dropdown-menu').append('<li><a class="'+jsclick+'" href="javascript:;" data-ident="'+ident+'" data-value="'+$(el).val()+'">'+$(el).text()+'</a></li>');
                if($(this).get(0).selected){
                    _select.find('.dropdown-menu li').eq(index).addClass('active');
                }
                if($(this).get(0).disabled){
                    _select.find('.dropdown-menu li').eq(index).addClass('disabled').find('.' + jsclick).attr('data-disabled', 'true');
                }
            });
            _select.find('.form-control').removeAttr('readonly').on('input propertychange',function(){
                v = $.trim($(this).val());
                _select.find('.dropdown-menu li').hide();
                _select.find('.dropdown-menu li a:contains("'+v+'")').parent('li').show();
                if(_select.find('.dropdown-menu li').size() == _select.find('.dropdown-menu li:hidden').size()){
                    if(_select.find('.dropdown-menu .select-none').size() < 1){
                        _select.find('.dropdown-menu').append('<li class="select-none">暂无匹配内容</li>');
                    }
                    _select.find('.dropdown-menu .select-none').show();
                }else{
                    _select.find('.dropdown-menu .select-none').hide();
                }
            });
            setEleInline(ele, options);
            $(document).on('show.bs.dropdown', _select,function (e) {
                $(this).find('.dropdown-menu').find('li').show();
                $(this).find('.dropdown-menu').find('li.select-none').hide();
            });
        }

        function Structure_grouping(ele, options){
            var i = 0;
            var ident = 0;
            var id = randoms(1001,999999);
            var html = '<div class="dropdown"><button class="btn btn-default dropdown-toggle" type="button" id="select-'+id+'" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true"><span class="text">请选择</span><span class="caret"></span></button> <ul class="dropdown-menu" aria-labelledby="select-'+id+'"></ul></div>';
            ele.after(html).attr('data-id', id).hide().next('.dropdown').addClass(select).attr('data-id', id);
            var _select = ele.next('.' + select + '[data-id="'+id+'"]');
            var elsize = ele.attr('data-size');
            if(typeof(elsize) != "undefined" && elsize != ''){
                _select.find('.dropdown-toggle').addClass('btn-'+elsize);
            }
            ele.children().each(function(index, el) {
                ident = randoms(100001,999999);
                $(this).attr('data-ident', ident);
                if(el.nodeName == 'OPTGROUP'){
                    _select.find('.dropdown-menu').append('<li class="dropdown-header">'+$(this).attr('label')+'</li>');
                    $(this).find('option').each(function(index2, el2) {
                        i++;
                        ident = randoms(100001,999999);
                        $(this).attr('data-ident', ident);
                        _select.find('.dropdown-menu').append('<li><a class="'+jsclick+'" href="javascript:;" data-ident="'+ident+'" data-value="'+$(el2).val()+'">'+$(el2).text()+'</a></li>');
                        if($(this).get(0).selected){
                            _select.find('.dropdown-menu li').eq(i).addClass('active');
                        }
                        if($(this).get(0).disabled){
                            _select.find('.dropdown-menu li').eq(i).addClass('disabled').find('.' + jsclick).attr('data-disabled', 'true');
                        }
                    });
                }else{
                    _select.find('.dropdown-menu').append('<li><a class="'+jsclick+'" href="javascript:;" data-ident="'+ident+'" data-value="'+$(el).val()+'">'+$(el).text()+'</a></li>');
                    if($(this).get(0).selected){
                        _select.find('.dropdown-menu li').eq(index).addClass('active');
                    }
                    if($(this).get(0).disabled){
                        _select.find('.dropdown-menu li').eq(index).addClass('disabled').find('.' + jsclick).attr('data-disabled', 'true');
                    }
                }
            });

            setEleInline(ele, options);
            _select.find('.dropdown-toggle > .text').html(ele.find('option:selected').text());
        }

        function Structure_single(ele, options){
            var id = randoms(1001,999999);
            var ident = id;
            var html = '<div class="dropdown"><button class="btn btn-default dropdown-toggle" type="button" id="select-'+id+'" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true"><span class="text">请选择</span><span class="caret"></span></button> <ul class="dropdown-menu" aria-labelledby="select-'+id+'"></ul></div>';
            ele.after(html).attr('data-id', id).hide().next('.dropdown').addClass(select).attr('data-id', id);
            var _select = ele.next('.' + select + '[data-id="'+id+'"]');
            var elsize = ele.attr('data-size');
            if(typeof(elsize) != "undefined" && elsize != ''){
                _select.find('.dropdown-toggle').addClass('btn-'+elsize);
            }
            ele.find('option').each(function(index, el) {
                ident = randoms(100001,999999);
                $(this).attr('data-ident', ident);
                _select.find('.dropdown-menu').append('<li><a class="'+jsclick+'" href="javascript:;" data-ident="'+ident+'" data-value="'+$(el).val()+'">'+$(el).text()+'</a></li>');
                if($(this).get(0).selected){
                    _select.find('.dropdown-menu li').eq(index).addClass('active');
                }
                if($(this).get(0).disabled){
                    _select.find('.dropdown-menu li').eq(index).addClass('disabled').find('.' + jsclick).attr('data-disabled', 'true');

                }
            });
            setEleInline(ele, options);
            _select.find('.dropdown-toggle > .text').html(ele.find('option:selected').text());
        }

        function setEleInline(ele, options){
            var style = ele.attr('data-style');
            var id = ele.attr('data-id');
            var _ele = '.' + select + '[data-id="'+id+'"]';
            if(style == 'inline'){
                $(_ele).wrap('<div class="ui-select-inline"></div>');
            }
        }

        function setSelected(ele, ident){
            var id = ele.attr('data-id');
            var el = $('.ui-select[data-id="'+id+'"]');
            var cid = '';
            if(ele.attr('multiple') == 'multiple'){
                if(el.find('.' + jsclick + '[data-ident="'+ident+'"]').attr('data-selected') == 'true'){
                    ele.find('[data-ident="'+ident+'"]').get(0).selected = false;
                    el.find('.' + jsclick + '[data-ident="'+ident+'"]').attr('data-selected', 'false');
                }else{
                    el.find('.' + jsclick + '[data-ident="'+ident+'"]').attr('data-selected', 'true');
                    ele.find('[data-ident="'+ident+'"]').get(0).selected = true;
                }
            }else{
                ele.find('[data-ident="'+ident+'"]').get(0).selected = true;
            }

            el.find('.dropdown-menu').find('li').removeClass('active').find('a[data-ident="'+ident+'"]').parent('li').addClass('active');
            el.find('.' + jsclick).removeClass('active');

            ele.find("option:selected").each(function(index, element) {
                cid = $(element).attr('data-ident');
                el.find('li').find('a[data-ident="'+cid+'"]').addClass('active');
                el.find('.' + jsclick + '[data-ident="'+cid+'"]').addClass('active');
            });

            el.find('.form-control').val(ele.find("option:selected").text());
            el.find('.dropdown-toggle > .text').html(ele.find("option:selected").text());

            el.trigger('select_change', [{
                id : id,
                elem : ele,
                othis : el,
                ident : ident,
                selected : ele.find('[data-ident="'+ident+'"]').get(0).selected,
                text :  el.find('.' + jsclick + '[data-ident="'+ident+'"]').text(),
                value : el.find('.' + jsclick + '[data-ident="'+ident+'"]').attr('data-value')
            }]);
        }

        function randoms(max, min){
            max = typeof(max) == "undefined" ? 999999999 : max;
            min = typeof(min) == "undefined" ? 100000001 : min;
            return parseInt(Math.random()*(max-min+1)+min,10);
        }

        function Plugin(option) {
            return this.each(function() {
                var $this = $(this);
                var options = typeof option == 'object' && option;
                new Iselect($this, options);
            })
        }

        Iselect.VERSION = '1.0';

        var old = $.fn.iselect;

        $.fn.iselect = Plugin;
        $.fn.iselect.Constructor = Iselect;

        $.fn.iselect.noConflict = function() {
            $.fn.iselect = old;
            return this;
        }

        $(document).on('click', '.' + jsclick, function (e) {
            if($(this).attr('data-disabled') != 'true'){
                var id = $(this).parent().parent('.dropdown-menu').parent('.ui-select').attr('data-id');
                if(typeof(id) == 'undefined'){
                    id = $(this).parent('.ui-select').attr('data-id');
                }
                setSelected($('select[data-id="'+id+'"]') , $(this).attr('data-ident'));
            }
        });
    }(jQuery);


    /* ========================================================================
     * 表单验证
     * ======================================================================== */
    +function($) {
        'use strict';
        var VERIFY = function(el, opt) {
            this.defaults = {

            };
            this.$ele = el;
            this.$options = $.extend({}, this.defaults, opt);
            this.init();

        }

        VERIFY.prototype.init = function() {
            var el = this.$ele, opt = this.$options, v = '', arr, r;
            el.submit(function(e){
                var d = {}, n = 0, ruleType = '';
                el.find('input,textarea,select').each(function(index, el) {
                    n = 0;
                    d[index] = {};
                    v = $(el).attr('data-verify');
                    if( typeof(v) == 'string' ){
                        arr = v.split("|");
                        for(var i= 0; i < arr.length; i++){
                            ruleType = arr[i];
                            d[index].ruleType = ruleType;
                            r = getRule(ruleType);
                            if( r != false ){
                                r = validateRegular(r, $(el).val(),  ruleType);
                                if( r == false ){
                                    n++;
                                    if(typeof(opt.error) == 'function'){
                                        opt.error(ruleType, el);
                                    }
                                    e.preventDefault();
                                    break;
                                }
                           
                            }else{

                                if(typeof(opt[ruleType]) == 'function'){
                                    if(opt[ruleType]( $(el).val(), el ) == false){
                                        n++;
                                        e.preventDefault();
                                        break;
                                    }
                                }

                            }
                            
                        }

                    }else{
                        
                        d[index].ruleType = '';
                   
                    }

                    d[index].item = el;
                    d[index].iserr = n > 0 ? true : false;
                    
                });

                if(typeof(opt.eleCallback) == 'function'){
                    opt.eleCallback(d);
                }
                
            });


        }

        VERIFY.VERSION = '1.0';

        var getRule = function(n){
            var r = {
                required : /^\s+$/,
                number : /^(\-|\+)?\d+(\.\d+)?$/,
                integer : /^[0-9-]+$/,
                letter : /^[a-z]+$/i,
                numberLetter : /^[0-9a-z]+$/i,
                email : /^[\w\-\.]+@[\w\-\.]+(\.\w+)+$/,
                qq : /^[0-9]{5,20}$/,
                url : /^http(s)?:\/\/.+/,
                mobile : /^(1)[0-9]{10}$/,
                identity : /(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}[0-9Xx]$)/,
                phone : /^[0-9-]{6,13}$/,
                postalCode : /^[0-9]{6}$/,
                alphaDash : /^[A-Za-z0-9\-\_]+$/,
                chs : /^[\u4E00-\u9FA5]{1,5}$/,
                chsAlphaNum : /^[A-Za-z0-9\u4e00-\u9fa5]+$/gi,
                chsDash : /^[A-Za-z0-9\u4e00-\u9fa5\-\_]+$/gi,
                ip : /^(?:(?:2[0-4][0-9]\.)|(?:25[0-5]\.)|(?:1[0-9][0-9]\.)|(?:[1-9][0-9]\.)|(?:[0-9]\.)){3}(?:(?:2[0-5][0-5])|(?:25[0-5])|(?:1[0-9][0-9])|(?:[1-9][0-9])|(?:[0-9]))$/,
                date : /^(\d{4})\-(\d{2})\-(\d{2})$/,
                dateTime : /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/,
                time : /(\d{2}):(\d{2}):(\d{2})$/
            }
            return typeof(r[n]) == 'undefined' ||  r[n] == '' ? false : r[n];
        }

        var validateRegular = function (reg, value, rule){
            if(value == 'undefined' || value == '') {
                return false;
            }
            var r = new RegExp(reg);

            if(rule == 'required') {
                return r.test(value) || value == '' ? false : true;
            }
            return r.test(value);
        }

        $.fn.verify = function(opt) {
            return this.each(function() {
                new VERIFY($(this), opt);
            });
        }

    }(jQuery);


});

